package com.task.scheduler.persistence.repository;

import com.task.scheduler.enums.TaskExecutionMode;
import com.task.scheduler.persistence.entity.TaskEntity;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

@Repository
public interface TaskRepository extends JpaRepository<TaskEntity, String> {

    // ==================== 基础查询方法 ====================

    /**
     * 查找未删除的任务
     */
    List<TaskEntity> findByDeletedFalse();

    /**
     * 分页查找未删除的任务
     */
    Page<TaskEntity> findByDeletedFalse(Pageable pageable);

    /**
     * 根据ID查找未删除的任务
     */
    Optional<TaskEntity> findByIdAndDeletedFalse(String id);

    /**
     * 根据任务类型查找未删除的任务
     */
    List<TaskEntity> findByTaskTypeAndDeletedFalse(String taskType);

    /**
     * 分页根据任务类型查找未删除的任务
     */
    Page<TaskEntity> findByTaskTypeAndDeletedFalse(String taskType, Pageable pageable);

    /**
     * 根据执行模式查找未删除的任务
     */
    List<TaskEntity> findByExecutionModeAndDeletedFalse(TaskExecutionMode executionMode);

    /**
     * 分页根据执行模式查找未删除的任务
     */
    Page<TaskEntity> findByExecutionModeAndDeletedFalse(TaskExecutionMode executionMode, Pageable pageable);

    /**
     * 根据任务类型和执行模式查找未删除的任务
     */
    List<TaskEntity> findByTaskTypeAndExecutionModeAndDeletedFalse(String taskType, TaskExecutionMode executionMode);

    /**
     * 分页根据任务类型和执行模式查找未删除的任务
     */
    Page<TaskEntity> findByTaskTypeAndExecutionModeAndDeletedFalse(String taskType, TaskExecutionMode executionMode, Pageable pageable);

    // ==================== 时间范围查询 ====================

    /**
     * 查找指定时间范围内创建的未删除任务
     */
    List<TaskEntity> findByCreatedAtBetweenAndDeletedFalse(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 分页查找指定时间范围内创建的未删除任务
     */
    Page<TaskEntity> findByCreatedAtBetweenAndDeletedFalse(LocalDateTime startTime, LocalDateTime endTime, Pageable pageable);

    /**
     * 查找指定时间之前创建的未删除任务
     */
    List<TaskEntity> findByCreatedAtBeforeAndDeletedFalse(LocalDateTime dateTime);

    /**
     * 查找指定时间之后创建的未删除任务
     */
    List<TaskEntity> findByCreatedAtAfterAndDeletedFalse(LocalDateTime dateTime);

    // ==================== 延迟任务查询 ====================

    /**
     * 查找延迟任务（延迟时间大于0）
     */
    List<TaskEntity> findByDelaySecondsGreaterThanAndDeletedFalse(long delaySeconds);

    /**
     * 查找立即执行的任务（延迟时间为0）
     */
    List<TaskEntity> findByDelaySecondsAndDeletedFalse(long delaySeconds);

    /**
     * 查找可以执行的延迟任务（预计执行时间已到）
     */
    @Query("SELECT t FROM TaskEntity t WHERE t.deleted = false " +
           "AND t.delaySeconds > 0 " +
           "AND FUNCTION('DATE_ADD', t.createdAt, INTERVAL t.delaySeconds SECOND) <= :currentTime")
    List<TaskEntity> findExecutableDelayedTasks(@Param("currentTime") LocalDateTime currentTime);

    // ==================== 统计查询 ====================

    /**
     * 统计未删除的任务总数
     */
    long countByDeletedFalse();

    /**
     * 根据任务类型统计未删除的任务数量
     */
    long countByTaskTypeAndDeletedFalse(String taskType);

    /**
     * 根据执行模式统计未删除的任务数量
     */
    long countByExecutionModeAndDeletedFalse(TaskExecutionMode executionMode);

    /**
     * 统计指定时间范围内创建的未删除任务数量
     */
    long countByCreatedAtBetweenAndDeletedFalse(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 统计延迟任务数量
     */
    long countByDelaySecondsGreaterThanAndDeletedFalse(long delaySeconds);

    // ==================== 自定义查询 ====================

    /**
     * 根据任务类型列表查找未删除的任务
     */
    @Query("SELECT t FROM TaskEntity t WHERE t.taskType IN :taskTypes AND t.deleted = false")
    List<TaskEntity> findByTaskTypesAndNotDeleted(@Param("taskTypes") List<String> taskTypes);

    /**
     * 查找最近创建的N个未删除任务
     */
    @Query("SELECT t FROM TaskEntity t WHERE t.deleted = false ORDER BY t.createdAt DESC")
    List<TaskEntity> findRecentTasks(Pageable pageable);

    /**
     * 查找需要清理的旧任务（超过指定天数且已删除）
     */
    @Query("SELECT t FROM TaskEntity t WHERE t.deleted = true " +
           "AND t.updatedAt < :cutoffTime")
    List<TaskEntity> findTasksForCleanup(@Param("cutoffTime") LocalDateTime cutoffTime);

    // ==================== 批量操作 ====================

    /**
     * 批量软删除任务
     */
    @Modifying
    @Query("UPDATE TaskEntity t SET t.deleted = true, t.updatedAt = :updateTime " +
           "WHERE t.id IN :taskIds AND t.deleted = false")
    int batchSoftDelete(@Param("taskIds") List<String> taskIds, @Param("updateTime") LocalDateTime updateTime);

    /**
     * 批量恢复已删除的任务
     */
    @Modifying
    @Query("UPDATE TaskEntity t SET t.deleted = false, t.updatedAt = :updateTime " +
           "WHERE t.id IN :taskIds AND t.deleted = true")
    int batchRestore(@Param("taskIds") List<String> taskIds, @Param("updateTime") LocalDateTime updateTime);

    /**
     * 物理删除已软删除的旧任务
     */
    @Modifying
    @Query("DELETE FROM TaskEntity t WHERE t.deleted = true " +
           "AND t.updatedAt < :cutoffTime")
    int physicalDeleteOldTasks(@Param("cutoffTime") LocalDateTime cutoffTime);

    // ==================== 存在性检查 ====================

    /**
     * 检查指定ID的未删除任务是否存在
     */
    boolean existsByIdAndDeletedFalse(String id);

    /**
     * 检查指定任务类型的未删除任务是否存在
     */
    boolean existsByTaskTypeAndDeletedFalse(String taskType);
}
